Skip to content

fix(web): release develop to main — cleanUrls auth/verify 404 fix - #167

Merged
github-actions[bot] merged 143 commits into
mainfrom
develop
Mar 19, 2026
Merged

fix(web): release develop to main — cleanUrls auth/verify 404 fix#167
github-actions[bot] merged 143 commits into
mainfrom
develop

Conversation

@tomymaritano

Copy link
Copy Markdown
Collaborator

Summary

  • Critical fix: cleanUrls: true in vercel.json to resolve /auth/verify 404 in production (magic link broken)
  • feat(share): public notes API with metadata for portfolio consumption
  • feat(ai): add tool use (function calling) to AI assistant
  • feat(release): automated release pipeline with semantic-release
  • feat(ai-core): provider-agnostic AI architecture with streaming
  • feat(sync): connect auth → payment → sync flow with license gating
  • Multiple other features and fixes accumulated in develop

Root Cause

apps/web/next.config.mjs uses output: 'export' (static HTML). Next.js generates auth/verify/index.html, but Vercel needs cleanUrls: true to map /auth/verifyauth/verify/index.html. Without it, the auth verify route returns 404.

Test plan

  • After merge: visit https://readied.app/auth/verify?token=test — should show verification UI, not 404
  • With real magic link token: should attempt to open readied://auth/verify?token=xxx via deep link
  • Verify Vercel auto-deploys from main successfully

🤖 Generated with Claude Code

tomymaritano and others added 30 commits March 11, 2026 01:41
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Notebooks now sync before notes in syncNow() to ensure note-notebook
dependencies are satisfied. Adds pullNotebooks/pushNotebooks methods
and applyRemoteNotebookChange for bidirectional notebook sync.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move validateNotebookTree from inline test definition to a shared module
so it can be reused by the API route and other consumers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add conflict state to SyncStatusIndicator with amber warning icon
and count. Conflicts now take priority over idle state so users
discover them without navigating to Settings.

Also export ConflictResolver from sync components barrel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DatabaseConnection.transaction() already calls the inner fn — no need
for extra () at call site.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix pullNotebooks() to only advance cursor to last successfully
  applied change (prevents skipping failed changes on retry)
- Fix tree validation snapshot to properly exclude deleted notebooks
  (prevents ghost parent references in validation)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat: add bidirectional notebook sync
test: add sync-core unit tests (62 tests)
feat: surface sync conflicts in status indicator
# Conflicts:
#	apps/desktop/src/main/services/apiClient.ts
#	apps/desktop/src/main/services/syncService.ts
#	packages/api/src/db/schema.ts
#	packages/api/src/routes/sync.ts
#	packages/storage-sqlite/src/migrations/index.ts
Configure automated code review with path-specific instructions
for core, storage, desktop, and API packages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ration

Add optional metadata (name, version, priority) to registerRemarkPlugin
and registerRehypePlugin signatures for debugging and execution ordering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
tomymaritano and others added 17 commits March 12, 2026 03:18
## Summary
- Fix `wrangler-action@v3` failing with `ERR_PNPM_ADDING_TO_ROOT` in
pnpm workspaces
- Add `packageManager: pnpm` and `workingDirectory: apps/web` to the
deploy step

## Context
The Deploy Web workflow has been failing on every push to main because
wrangler-action tries `pnpm add wrangler` at the workspace root without
`-w`.

## Test plan
- [ ] Merge to develop, then main, verify deploy workflow passes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Updated deployment automation configuration to enhance build and
release processes with improved package manager specification and
working directory handling.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary
- Add step to create `readied-web` project on Cloudflare Pages before
deploying
- Uses `continue-on-error: true` so it doesn't fail when project already
exists
- Add `--commit-dirty=true` to suppress wrangler git warning

## Context
The Deploy Web workflow has never succeeded — project `readied-web`
doesn't exist on Cloudflare Pages (error code 8000007).

## Test plan
- [ ] Merge to develop → main, verify deploy succeeds

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Mirror of #138

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Mirror of #140

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary

Full rebuild of the marketing site with a modern, minimal design system:

- **Design System**: Violet accent (#8b5cf6) on dark zinc base, Inter +
JetBrains Mono fonts, dark-mode only
- **shadcn/ui**: Button, Card, Badge, Separator, Accordion, Sheet
components (new-york style)
- **Magic UI**: AnimatedShinyText, BorderBeam, DotPattern, Marquee,
NumberTicker, ShimmerButton, TextReveal effects
- **Rebuilt components**: Navbar (Sheet mobile nav), Footer (DotPattern
bg), Hero (ShimmerButton + BorderBeam), SocialProof (Marquee), Features
(BorderBeam hover), WhyLocal (TextReveal), Audience, Pricing
(NumberTicker + Accordion), Download (AnimatedShinyText)
- **Cleanup**: Removed @headlessui/react, migrated FaqAccordion to
shadcn Accordion
- **Design tokens**: All pages updated from hardcoded colors to Tailwind
v4 CSS custom properties

### New Dependencies
- framer-motion, class-variance-authority, clsx, tailwind-merge,
tailwindcss-animate
- @fontsource/inter, @fontsource-variable/jetbrains-mono
- @radix-ui/react-slot, @radix-ui/react-accordion,
@radix-ui/react-dialog, @radix-ui/react-separator

### Removed
- @headlessui/react

## Test plan
- [x] `pnpm build` passes (37+ static pages generated)
- [x] No TypeScript errors in modified files
- [x] No @headlessui/react imports remain
- [ ] Visual verification of all pages in dev mode
- [ ] Fumadocs docs render correctly with dark theme
- [ ] Mobile nav (Sheet) opens/closes correctly

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Major marketing site redesign: new hero, video guides, testimonials,
creator story, and animated landing sections.
* New UI primitives: cards, accordions, sheet-based mobile menu,
animated beams, marquees, shiny text, number ticker, and modal video
viewer.
* Pricing page: live animated pricing display and accordion FAQs;
download page unified per-platform cards.

* **Style**
* Unified semantic color tokens, violet-focused palette, updated fonts
(Inter + JetBrains Mono), and new animations (marquee, shimmer, grid).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary

- **Website redesign**: Rebuilt all marketing pages with Magic UI
components (shimmer, border beam, text reveal, marquee, number ticker),
shadcn/ui base components, and a new violet accent design system with
Inter + JetBrains Mono fonts
- **CodeRabbit fixes**: Accessibility improvements (aria labels,
semantic HTML, reduced-motion), stable React keys, design token
alignment
- **Auth UX rethink**: Replaced buried Settings > Account login with
direct "Enable Sync" flow from sidebar — value proposition modal, resend
timer, auto-detect deep link verification
- **Auth bug fixes**: Fixed API returning 500 instead of 401 for invalid
JWTs, fixed deep link race condition when app cold-starts from magic
link
- **Sync onboarding**: Shows prompt after 3+ notes created, dismissible
- **Web auth fallback**: Improved verify page for wrong-device and
app-not-installed scenarios

## Changes by area

### Website (`apps/web/`)
- New design system: violet accent, Inter + JetBrains Mono
- shadcn/ui: Button, Card, Badge, Separator, Accordion, Sheet
- Rebuilt: Navbar, Hero, Footer, SocialProof, Features, WhyLocal,
Audience, Pricing, Download, Philosophy
- Magic UI: AnimatedGridPattern, BorderBeam, Marquee, NumberTicker,
ShimmerButton, TextReveal, AnimatedShinyText
- Migrated FaqAccordion from @headlessui/react to shadcn
- Improved auth/verify fallback page

### Desktop (`apps/desktop/`)
- New `EnableSyncModal` with 5-step wizard (value prop → email → sent →
success)
- `SidebarFooter`: "Sign In" → "Enable Sync" (opens modal directly)
- `useSyncOnboarding` hook: prompt after 3+ notes
- Sync prompt banner in sidebar (dismissible)
- Deep link race condition fix (queues token if window not ready)

### API (`packages/api/`)
- Fixed `onError` handler swallowing `HTTPException` (401s returned as
500)
- Fixed auth middleware catch block losing specific error messages

### Config (`packages/product-config/`)
- Fixed extensionless imports for cross-package compatibility

## Test plan

- [x] `pnpm typecheck` — 18/18 packages pass
- [x] `pnpm test` — all tests pass (pre-push hook)
- [ ] Visual review of all marketing pages
- [ ] Test Enable Sync flow: sidebar → modal → email → magic link →
verify
- [ ] Test deep link cold-start (kill app → click magic link)
- [ ] Verify CodeRabbit has no new comments

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Desktop: prominent sync onboarding prompt and multi-step "Enable Sync"
modal.

* **Improvements**
  * Clearer auth verification flow with fallback actions.
* Accessibility enhancements across web and desktop (semantic dialogs,
reduced-motion support, better aria attributes).
  * Locale-aware number formatting and improved video modal semantics.

* **Bug Fixes**
* More reliable deep-link token delivery and safer rendering in animated
components.

* **Documentation**
  * Added roadmap for Auth, Sync, and AI work.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
# Conflicts:
#	apps/desktop/src/renderer/components/sync/index.ts
#	apps/web/app/(marketing)/auth/verify/AuthVerifyContent.tsx
#	apps/web/app/(marketing)/changelog/page.tsx
#	apps/web/app/(marketing)/download/page.tsx
#	apps/web/app/(marketing)/faq/page.tsx
#	apps/web/app/(marketing)/page.tsx
#	apps/web/app/(marketing)/philosophy/page.tsx
#	apps/web/app/(marketing)/plugins/page.tsx
#	apps/web/app/(marketing)/pricing/page.tsx
#	apps/web/app/(marketing)/privacy/page.tsx
#	apps/web/app/(marketing)/terms/page.tsx
#	apps/web/app/docs/[[...slug]]/page.tsx
#	apps/web/app/docs/layout.tsx
#	apps/web/app/globals.css
#	apps/web/app/layout.tsx
#	apps/web/components/FaqAccordion.tsx
#	apps/web/components/Footer.tsx
#	apps/web/components/MobileNav.tsx
#	apps/web/components/Navbar.tsx
#	apps/web/components/landing/Audience.tsx
#	apps/web/components/landing/ComparisonTable.tsx
#	apps/web/components/landing/Features.tsx
#	apps/web/components/landing/Hero.tsx
#	apps/web/components/landing/SocialProof.tsx
#	apps/web/components/landing/WhyLocal.tsx
#	apps/web/content/docs/architecture/overview.mdx
#	apps/web/content/docs/guide/principles.mdx
#	apps/web/content/docs/index.mdx
#	apps/web/content/docs/plugins/getting-started.mdx
#	apps/web/mdx-components.tsx
#	apps/web/package.json
#	pnpm-lock.yaml
Phase 1 — Backend fixes:
- Fix auth middleware: all jose error types return 401 JSON (not 500)
- Document all 24 API endpoints in api-reference.md

Phase 2 — Sync stability:
- Add sync error propagation to renderer via IPC status events
- Add exponential backoff on auto-sync failures (cap 5min)
- Auto-stop sync on 401 with auth-expired event
- Abort in-flight sync operations on logout via AbortController
- Token refresh returns typed errors (expired/network/device_limit)
- Sync onboarding prompt after 5 notes (session-dismissable)
- Offline queue visibility in sidebar footer (pending count)

Phase 3 — AI Commands (Cmd+K v1):
- Add 'ai' command category with toggle-panel, summarize, rewrite, tweet
- Remap Cmd+K to AI panel, insert-link to Cmd+Shift+K
- Integrate AiPanel into App layout as right-side panel
- Add AI Settings section (API key, model selector, context notes)
- Settings schema v2 with v1→v2 migration
- Wire existing ai-assistant package (Claude client, RAG, prompts)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 4 — AI Knowledge (Cmd+K v2):
- Add RAG context fetching: queries search relevant notes automatically
- Add ai:ask-notes command (Cmd+Shift+K) with dedicated system prompt
- Auto-include related notes as context when a note is selected
- Mode toggle in AI panel (Chat vs Ask Notes)
- Context badge showing number of notes used as RAG context
- ASK_NOTES_SYSTEM_PROMPT instructs AI to cite note titles

Phase 5 — AI Extensibility:
- Add AiCommandDefinition type with prompt templates ({{selection}}, {{note}}, {{title}})
- Add AiCommandPreset type for shareable command collections
- Add resolveTemplate(), validateAiCommandDefinition(), validateAiCommandPreset()
- Add aiCommandStore (Zustand vanilla) for plugin-registered AI commands
- Add registerAiCommand() to PluginContext API
- Add IPC handlers for preset import/export (file dialog)
- Add preset management UI in Settings > AI Assistant
- 28 tests for command types, validation, and serialization

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…150)

## Summary

- **Phase 4 (AI Knowledge)**: Wire `ai:summarize`, `ai:rewrite`,
`ai:tweet` commands with real Claude prompts and output routing (replace
selection, insert at cursor, or show in panel)
- **Phase 5 (Extensibility)**: Bridge plugin AI command store → command
palette so plugin-registered AI commands are discoverable and executable

## Changes

### Phase 4
- Add built-in prompt templates (SUMMARIZE, REWRITE, TWEET) to
`packages/ai-assistant`
- AiPanel supports `initialCommand` prop for auto-execution
- Output target routing: `replace` swaps editor selection, `insert` adds
at cursor, `panel` shows in chat
- Handler wiring in App.tsx → useRegisterAiCommands

### Phase 5
- New `useRegisterPluginAiCommands` hook subscribes to `aiCommandStore`
and syncs to `CommandRegistry`
- Plugin AI commands auto-appear in command palette with `AI:` prefix
- Template resolution with editor context (`{{selection}}`, `{{note}}`,
`{{title}}`)
- Automatic cleanup on plugin unload

## Test plan
- [ ] Open command palette → verify Summarize/Rewrite/Tweet commands
appear
- [ ] Select text → invoke Summarize → AI panel shows summary
- [ ] Select text → invoke Rewrite → selection replaced in editor
- [ ] Select text → invoke Tweet → AI panel shows tweet version
- [ ] Cmd+K opens AI panel in chat mode
- [ ] Cmd+Shift+K opens AI panel in ask-notes mode

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

## Release Notes

* **New Features**
* Added AI command suite: summarize, rewrite, and tweet built-in AI
commands with panel integration.
* Introduced violet-centric design system with new color tokens and
theme consistency.
* Enabled automated release workflow via GitHub Actions with semantic
versioning.

* **Bug Fixes**
  * Enhanced token encoding for secure authentication flows.
* Improved sync error handling with better retry logic and abort
handling.

* **Documentation**
  * Added comprehensive roadmap and changelog documentation.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary
- Migrated all Tailwind CSS classes to v4 canonical names
(`bg-gradient-to-*` → `bg-linear-to-*`, opacity fractions simplified)
- Removed deprecated `baseUrl` and unused `paths` from `ai-assistant`
and `command-registry` tsconfigs

## Changes
- **24 files** across `apps/web` components and 2 package tsconfigs
- No logic changes — purely class name modernization and config cleanup

## Test plan
- [x] `pnpm typecheck` passes 18/18
- [x] `pnpm test` passes
- [ ] Visual check of web app (Tailwind classes should render
identically)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Style**
* Standardized border opacity values and color styling across the
application for improved visual consistency.
* Updated gradient utilities to use a unified styling approach
throughout UI components.
* Refined background and border color tokens with shorter opacity syntax
for cleaner styling declarations.
* Applied consistent opacity values to buttons, dividers, badges, and
decorative elements across marketing pages and navigation.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
)

## Summary

- **License-gated auto-sync**: Prevents 403 errors for free/expired
users by checking license state before starting sync
- **Smart EnableSyncModal**: License-aware step routing — computes
initial step based on auth × license state (skips pricing for trial
users, skips auth for already-signed-in users)
- **Stripe checkout integration**: Monthly (€2/mo) and annual (€20/year)
plan selection with real Stripe checkout flow
- **Sidebar drag-and-drop fixes**: Grip handle for intentional drags,
circular reference prevention, recursive child depth update on move
- **SyncStatusIndicator**: Replaced hardcoded hex colors with design
token CSS classes
- **Product-config pricing alignment**: Updated from USD placeholders to
actual EUR Stripe prices
- **CI/CD**: Auto-deploy API to Cloudflare Workers on push to main

## Files changed

| Area | Files |
|------|-------|
| Auth/Sync | `authStore.ts`, `useSyncOnboarding.ts`,
`EnableSyncModal.tsx` |
| UI | `LoginModal.module.css`, `SyncStatusIndicator.tsx/.module.css`,
`global.css` |
| Sidebar | `NotebookItem.tsx`, `index.ts` (main process) |
| Config | `product-config/facade.ts` |
| CI/CD | `.github/workflows/deploy-api.yml` |

## Test plan

- [ ] New user (trial active, not auth'd) → Enable Sync → value-prop →
email → success
- [ ] Trial expired, not auth'd → Enable Sync → value-prop → email →
pricing → checkout → success
- [ ] Authenticated + free → Enable Sync → pricing → checkout → success
- [ ] Authenticated + pro → Enable Sync → shows "already syncing"
success
- [ ] Drag notebooks via grip handle only — text selection still works
- [ ] Move parent folder with children — all children depths update
correctly
- [ ] `pnpm typecheck` passes
- [ ] `pnpm test` passes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added drag-and-drop support for organizing notebooks with visual
feedback.
* Enhanced sync onboarding with license-aware capability checks and
subscription options.
* Improved magic link authentication with real-time verification
feedback.

* **Bug Fixes**
* Fixed circular reference issues when reorganizing notebook
hierarchies.
  * Enhanced auto-sync activation with license state validation.

* **Style**
  * Unified design token system with dark/light theme support.
  * Updated error messaging UI in authentication flow.

* **Chores**
  * Updated pricing to EUR.
  * Consolidated design system infrastructure.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary

- **New `@readied/ai-core` package** — provider-agnostic AI architecture
with LLMProvider interface, ProviderRegistry, streaming SSE parser,
retry logic with exponential backoff, context builder with token
budgeting, and AIService orchestrator
- **Full Electron integration** — IPC bridge with batched streaming
events, preload API, and renderer AiPanel wired to the new streaming
architecture
- **UX fixes** — unified dual AI panel entry points (Cmd+K and Sparkles
button) into single panel, fixed panel height to fill container, made
React DevTools dev-only via dynamic import
- **Monorepo fix** — pinned `@types/react` to 18.x via pnpm overrides to
resolve lucide-react type mismatch

## Architecture

```
Renderer (AiPanel) → IPC → Main (ai-core bridge) → AIService → ProviderRegistry → AnthropicProvider → SSE stream
                   ←  batched LLMEvents (text/error/done)  ←
```

## What's included

### packages/ai-core (new)
- `LLMProvider` interface + `ProviderRegistry` for pluggable providers
- `AnthropicProvider` with native SSE streaming (no SDK dependency)
- `ContextBuilder` with token budgeting and automatic content trimming
- `AIService` orchestrator with retry, cancellation, and context
building
- `LLMEvent` protocol: `text`, `error`, `done`, `tool_call`,
`tool_result`
- Reusable SSE stream parser

### apps/desktop
- IPC bridge with 50ms batched event streaming (main → renderer)
- Preload API: `window.readied.ai.chat()`, `.onEvent()`, `.cancel()`
- Unified AI panel (single instance, both Cmd+K and Sparkles button
toggle it)
- Panel height fix (fills container instead of 350px cutoff)
- Dynamic import for electron-devtools-installer (excluded from prod)

### Monorepo
- Removed deprecated `@readied/ai-assistant` package
- Added `pnpm.overrides` to pin `@types/react@18.3.27` across workspace

## Test plan

- [x] All 16 packages pass `pnpm test`
- [x] `pnpm typecheck` passes (17/17 tasks)
- [x] `pnpm build` succeeds
- [ ] Manual: Cmd+K opens AI panel in ask-notes mode
- [ ] Manual: Sparkles button toggles same panel
- [ ] Manual: AI chat streams responses correctly
- [ ] Manual: Panel fills full height of sidebar

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
  * Added streaming AI chat responses for real-time interaction
  * Introduced provider selection (Anthropic, OpenAI, Ollama support)
  * Added ability to cancel in-flight AI requests
  * Implemented configuration validation for AI providers
  * Enhanced chat interface with conversation modes

* **Refactor**
  * Restructured AI system for multi-provider support
  * Updated settings schema with provider configuration

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary

- Replace manual release process with a two-stage automated pipeline
using **semantic-release**
- **Stage 1** (`release.yml`): `workflow_dispatch` on main →
semantic-release analyzes commits, bumps version, creates tag + draft
GitHub Release (~30s)
- **Stage 2** (`build.yml`): tag push triggers parallel mac/win/linux
builds → signs + notarizes macOS → uploads artifacts → undrafts release
→ tweets → auto-PR syncs main→develop

## Changes

- Add `release.config.js` (conventionalcommits preset, draft release,
beta channel ready)
- Add `scripts/bump-version.js` with tests (syncs version across
monorepo)
- Replace `.github/workflows/release.yml` (200 lines → 46 lines
semantic-release workflow)
- Create `.github/workflows/build.yml` (parallel platform builds +
publish + tweet + sync-develop)
- Delete `.github/workflows/auto-tag.yml` (replaced by semantic-release)
- Update CLAUDE.md Git Flow section with release process + rollback docs
- Add semantic-release + plugins as devDependencies

## Required: New GitHub Secret

Create a `GH_TOKEN` repository secret — a Personal Access Token with
`contents: write` scope. Needed because:
1. semantic-release must push tags that trigger other workflows
(GITHUB_TOKEN can't do this)
2. electron-builder needs write access to upload artifacts to GitHub
Releases

## Test plan

- [x] All existing tests pass (`pnpm test`)
- [x] `scripts/bump-version.test.js` — 2 new tests passing
- [x] `release.config.js` loads correctly
- [x] All workflow YAML files are syntactically valid
- [ ] Create `GH_TOKEN` secret in repo settings
- [ ] After merge to main: click "Run workflow" on Release action to
test end-to-end

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Implemented automated release pipeline with semantic versioning,
generating changelogs automatically.
* Added multi-platform build automation for simultaneous macOS, Windows,
and Linux releases.

* **Documentation**
* Updated Git Flow and release process documentation to reflect new
automated workflows.

* **Tests**
  * Added tests for automated version management.

* **Chores**
  * Refined release workflows for improved efficiency and reliability.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary

- Adds `cleanUrls: true` to `vercel.json`
- Fixes the 404 on `/auth/verify` (and all other static pages without
`.html` extension)

## Root cause

Next.js static export generates `auth/verify.html`, but without
`cleanUrls: true`, Vercel doesn't know to serve it when the URL is
`/auth/verify` (no `.html`). This affects the magic link email
verification flow.

## Test plan

- [ ] Deploy to Vercel preview
- [ ] Visit `/auth/verify` — should show "Invalid Link" (no token)
- [ ] Visit `/auth/verify?token=test` — should show "Opening Readied..."
- [ ] Verify other pages still work (`/download`, `/pricing`,
`/changelog`)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Updated application configuration to enable clean URLs, improving URL
structure and formatting across the platform.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary
- **ai-core**: Add `ToolRegistry`, `runToolLoop` orchestrator,
`chatWithTools()` on `AIService`, tool_use SSE parsing in
AnthropicProvider, and `stop` event with `tool_use`/`tool_result`
ContentPart types
- **desktop (main)**: Register 6 built-in tools (search_notes,
read_note, list_notebooks, create_note, insert_text, replace_selection)
with confirmation flow and renderer-executed tool IPC bridge
- **desktop (renderer)**: `ToolCallBlock` component with status
indicators/icons, tool call tracking in `AiPanel`, and renderer-side
execution of editor tools (insert_text, replace_selection)

### Tools
| Tool | Type | Confirmation |
|------|------|-------------|
| `search_notes` | Read (main) | Auto |
| `read_note` | Read (main) | Auto |
| `list_notebooks` | Read (main) | Auto |
| `create_note` | Write (main) | Required |
| `insert_text` | Write (renderer) | Required |
| `replace_selection` | Write (renderer) | Required |

## Test plan
- [x] All 153 tests pass (`pnpm test`)
- [x] Typecheck clean (`pnpm typecheck` — main, preload, renderer)
- [x] Build succeeds (`pnpm build`)
- [ ] Manual: open AI panel, send message with `tools: true`, verify
tool calls render
- [ ] Manual: approve/reject tool confirmation flow
- [ ] Manual: verify insert_text and replace_selection modify the editor


🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Streaming AI chat with multi-turn conversations and built-in note
management tools (search, read, create, and editor actions)
* Tool confirmation UI allowing users to approve/reject AI tool
executions before they run
* Enhanced chat interface with provider validation and improved request
controls

* **Documentation**
* Added comprehensive AI architecture and tool-use implementation guides

* **Style**
* Updated visual color opacity tokens across UI components for
consistency
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…#166)

## Summary

- **Extended `sharedNotes` schema** with `tags`, `backlinks`,
`wordCount`, and `notebookName` columns (all `NOT NULL DEFAULT` —
backward-compatible)
- **Added `GET /share/public/:userId`** list endpoint with pagination
(`?limit=20&offset=0`) and permissive CORS for cross-origin portfolio
consumption
- **Enriched `GET /share/:slug`** detail endpoint to return metadata
(tags, backlinks, wordCount, notebookName)
- **Updated `POST /share`** to accept and persist metadata fields (Zod
defaults keep old clients working)
- **Desktop app** now sends full note metadata (tags, wordCount,
notebookName, backlinks) when sharing
- **Hand-corrected migration** (`0005`) uses safe `ALTER TABLE ADD
COLUMN` instead of Drizzle's auto-generated `CREATE TABLE`

## Test plan

- [x] `pnpm typecheck` passes (17/17 tasks)
- [x] `pnpm test` passes (42/42 tests across 7 test files)
- [ ] Manual: share a note from desktop → verify API receives
tags/wordCount/notebookName
- [ ] Manual: `curl
"https://api.readied.app/share/public/<userId>?limit=5"` returns
paginated notes with metadata
- [ ] Manual: `curl "https://api.readied.app/share/<slug>"` returns
enriched response with tags/backlinks
- [ ] Manual: fetch from different origin (portfolio domain) succeeds
for `/share/public/*` (CORS)
- [ ] Run `pnpm db:migrate` on staging to verify migration applies
cleanly

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added ability to share notes with enhanced metadata including tags,
word count, and notebook context.
  * Introduced public notes listing endpoint with pagination support.

* **Documentation**
* Updated documentation component infrastructure for improved content
rendering.

* **Style**
* Refined color and gradient utilities across the web interface for
improved visual consistency.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Mar 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 190 files, which is 40 over the limit of 150.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 0ef70318-79b7-4186-b347-58d824e3b388

📥 Commits

Reviewing files that changed from the base of the PR and between 0c6495e and a472580.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (190)
  • .claude/settings.local.json
  • .github/CODEOWNERS
  • .github/RELEASE.md
  • .github/workflows/build.yml
  • .github/workflows/deploy-api.yml
  • .github/workflows/release.yml
  • .gitignore
  • CHANGELOG.md
  • CLAUDE.md
  • CONTRIBUTING.md
  • LICENSE
  • README.md
  • ROADMAP.md
  • apps/desktop/package.json
  • apps/desktop/src/main/ai/built-in-tools.ts
  • apps/desktop/src/main/ai/ipc-ai.ts
  • apps/desktop/src/main/ai/setup.ts
  • apps/desktop/src/main/handlers/shareHandlers.ts
  • apps/desktop/src/main/index.ts
  • apps/desktop/src/main/services/apiClient.ts
  • apps/desktop/src/main/services/syncService.ts
  • apps/desktop/src/preload/index.ts
  • apps/desktop/src/renderer/App.tsx
  • apps/desktop/src/renderer/components/NoteEditor.tsx
  • apps/desktop/src/renderer/components/ai/AiPanel.tsx
  • apps/desktop/src/renderer/components/ai/ToolCallBlock.tsx
  • apps/desktop/src/renderer/components/auth/MagicLinkFlow.module.css
  • apps/desktop/src/renderer/components/auth/MagicLinkFlow.tsx
  • apps/desktop/src/renderer/components/sidebar/NotebookItem.tsx
  • apps/desktop/src/renderer/components/sidebar/NotebookList.tsx
  • apps/desktop/src/renderer/components/sidebar/Sidebar.tsx
  • apps/desktop/src/renderer/components/sidebar/SidebarFooter.tsx
  • apps/desktop/src/renderer/components/sync/EnableSyncModal.tsx
  • apps/desktop/src/renderer/components/sync/LoginModal.module.css
  • apps/desktop/src/renderer/components/sync/LoginModal.tsx
  • apps/desktop/src/renderer/components/sync/SyncStatusIndicator.module.css
  • apps/desktop/src/renderer/components/sync/SyncStatusIndicator.tsx
  • apps/desktop/src/renderer/components/sync/index.ts
  • apps/desktop/src/renderer/hooks/useRegisterAiCommands.ts
  • apps/desktop/src/renderer/hooks/useRegisterPluginAiCommands.ts
  • apps/desktop/src/renderer/hooks/useSyncOnboarding.ts
  • apps/desktop/src/renderer/pages/settings/SettingsApp.tsx
  • apps/desktop/src/renderer/pages/settings/components/SettingsSidebar.tsx
  • apps/desktop/src/renderer/pages/settings/sections/AiSection.tsx
  • apps/desktop/src/renderer/plugins/aiAssistant.tsx
  • apps/desktop/src/renderer/stores/authStore.ts
  • apps/desktop/src/renderer/stores/settings/schema.ts
  • apps/desktop/src/renderer/stores/settings/settingsStore.ts
  • apps/desktop/src/renderer/stores/syncStore.ts
  • apps/desktop/src/renderer/styles/ai-panel.css
  • apps/desktop/src/renderer/styles/global.css
  • apps/desktop/src/renderer/styles/tokens.css
  • apps/desktop/src/renderer/ui/README.md
  • apps/desktop/src/renderer/ui/components/.gitkeep
  • apps/desktop/src/renderer/ui/patterns/.gitkeep
  • apps/desktop/src/renderer/ui/primitives/.gitkeep
  • apps/desktop/src/renderer/ui/tokens/tokens.css
  • apps/web/.gitignore
  • apps/web/app/(marketing)/auth/verify/AuthVerifyContent.tsx
  • apps/web/app/(marketing)/auth/verify/page.tsx
  • apps/web/app/(marketing)/changelog/page.tsx
  • apps/web/app/(marketing)/download/page.tsx
  • apps/web/app/(marketing)/faq/page.tsx
  • apps/web/app/(marketing)/page.tsx
  • apps/web/app/(marketing)/philosophy/page.tsx
  • apps/web/app/(marketing)/plugins/page.tsx
  • apps/web/app/(marketing)/pricing/page.tsx
  • apps/web/app/(marketing)/privacy/page.tsx
  • apps/web/app/(marketing)/shared/SharedNoteContent.tsx
  • apps/web/app/(marketing)/shared/page.tsx
  • apps/web/app/(marketing)/subscription/cancel/page.tsx
  • apps/web/app/(marketing)/subscription/success/page.tsx
  • apps/web/app/(marketing)/terms/page.tsx
  • apps/web/app/docs/[[...slug]]/page.tsx
  • apps/web/app/docs/layout.tsx
  • apps/web/app/globals.css
  • apps/web/app/layout.tsx
  • apps/web/app/not-found.tsx
  • apps/web/components/FaqAccordion.tsx
  • apps/web/components/Footer.tsx
  • apps/web/components/MobileNav.tsx
  • apps/web/components/NavDropdown.tsx
  • apps/web/components/Navbar.tsx
  • apps/web/components/NewsletterForm.tsx
  • apps/web/components/PluginFilter.tsx
  • apps/web/components/SubscribeFlow.tsx
  • apps/web/components/landing/Audience.tsx
  • apps/web/components/landing/ComparisonTable.tsx
  • apps/web/components/landing/CreatorStory.tsx
  • apps/web/components/landing/Features.tsx
  • apps/web/components/landing/Hero.tsx
  • apps/web/components/landing/SocialProof.tsx
  • apps/web/components/landing/Testimonials.tsx
  • apps/web/components/landing/VideoGuides.tsx
  • apps/web/components/landing/WhyLocal.tsx
  • apps/web/components/magicui/animated-beam.tsx
  • apps/web/components/magicui/animated-grid-pattern.tsx
  • apps/web/components/magicui/animated-shiny-text.tsx
  • apps/web/components/magicui/border-beam.tsx
  • apps/web/components/magicui/dot-pattern.tsx
  • apps/web/components/magicui/hero-video-dialog.tsx
  • apps/web/components/magicui/marquee.tsx
  • apps/web/components/magicui/number-ticker.tsx
  • apps/web/components/magicui/shimmer-button.tsx
  • apps/web/components/magicui/text-reveal.tsx
  • apps/web/components/ui/accordion.tsx
  • apps/web/components/ui/badge.tsx
  • apps/web/components/ui/button.tsx
  • apps/web/components/ui/card.tsx
  • apps/web/components/ui/separator.tsx
  • apps/web/components/ui/sheet.tsx
  • apps/web/content/docs/architecture/overview.mdx
  • apps/web/content/docs/guide/principles.mdx
  • apps/web/content/docs/index.mdx
  • apps/web/content/docs/plugins/getting-started.mdx
  • apps/web/lib/layout.shared.tsx
  • apps/web/lib/utils.ts
  • apps/web/mdx-components.tsx
  • apps/web/package.json
  • docs/plans/2026-03-12-roadmap-auth-sync-ai.md
  • docs/plans/2026-03-12-website-redesign-design.md
  • docs/plans/2026-03-12-website-redesign-implementation.md
  • docs/plans/api-reference.md
  • docs/superpowers/plans/2026-03-14-ai-core-provider-abstraction.md
  • docs/superpowers/plans/2026-03-14-automated-release-pipeline.md
  • docs/superpowers/plans/2026-03-18-ai-tool-use.md
  • docs/superpowers/specs/2026-03-14-ai-core-provider-abstraction-design.md
  • docs/superpowers/specs/2026-03-14-automated-release-pipeline-design.md
  • docs/superpowers/specs/2026-03-18-ai-tool-use-design.md
  • package.json
  • packages/ai-assistant/src/claude-client.ts
  • packages/ai-assistant/src/index.ts
  • packages/ai-assistant/src/prompts.ts
  • packages/ai-assistant/src/rag.ts
  • packages/ai-core/package.json
  • packages/ai-core/src/ai-command-types.test.ts
  • packages/ai-core/src/ai-command-types.ts
  • packages/ai-core/src/ai-service.ts
  • packages/ai-core/src/context-builder.ts
  • packages/ai-core/src/index.ts
  • packages/ai-core/src/provider-registry.ts
  • packages/ai-core/src/provider.ts
  • packages/ai-core/src/providers/anthropic.ts
  • packages/ai-core/src/providers/sse-parser.ts
  • packages/ai-core/src/retry.ts
  • packages/ai-core/src/tool-loop.ts
  • packages/ai-core/src/tool-registry.ts
  • packages/ai-core/src/types.ts
  • packages/ai-core/tests/ai-command-types.test.ts
  • packages/ai-core/tests/ai-service.test.ts
  • packages/ai-core/tests/context-builder.test.ts
  • packages/ai-core/tests/provider-registry.test.ts
  • packages/ai-core/tests/providers/anthropic-tool-parsing.test.ts
  • packages/ai-core/tests/providers/anthropic.test.ts
  • packages/ai-core/tests/providers/sse-parser.test.ts
  • packages/ai-core/tests/retry.test.ts
  • packages/ai-core/tests/tool-loop.test.ts
  • packages/ai-core/tests/tool-registry.test.ts
  • packages/ai-core/tests/types.test.ts
  • packages/ai-core/tsconfig.json
  • packages/api/src/db/schema.ts
  • packages/api/src/index.ts
  • packages/api/src/middleware/auth.ts
  • packages/api/src/routes/share.ts
  • packages/command-registry/src/definitions/ai.ts
  • packages/command-registry/src/definitions/editor.ts
  • packages/command-registry/src/definitions/index.ts
  • packages/command-registry/src/types.ts
  • packages/command-registry/tsconfig.json
  • packages/design-system/LICENSE
  • packages/design-system/package.json
  • packages/design-system/src/components/Button.tsx
  • packages/design-system/src/components/Card.tsx
  • packages/design-system/src/components/Input.tsx
  • packages/design-system/src/components/index.ts
  • packages/design-system/src/index.ts
  • packages/design-system/src/tokens/reset.css
  • packages/design-system/src/tokens/tokens.css
  • packages/design-system/tsconfig.json
  • packages/licensing/package.json
  • packages/plugin-api/src/ai/aiCommandStore.ts
  • packages/plugin-api/src/index.ts
  • packages/plugin-api/src/lifecycle/PluginRegistry.ts
  • packages/plugin-api/src/types.ts
  • packages/product-config/src/facade.ts
  • packages/product-config/src/index.ts
  • release.config.js
  • scripts/bump-version.js
  • scripts/bump-version.test.js
  • vercel.json

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch develop
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@vercel

vercel Bot commented Mar 19, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
readide Ready Ready Preview, Comment Mar 19, 2026 2:28pm

Request Review

# Conflicts:
#	.claude/settings.local.json
#	.github/workflows/build.yml
#	apps/desktop/package.json
#	apps/desktop/src/main/ai/ipc-ai.ts
#	apps/desktop/src/main/ai/setup.ts
#	apps/desktop/src/main/index.ts
#	apps/desktop/src/preload/index.ts
#	apps/desktop/src/renderer/components/ai/AiPanel.tsx
#	apps/desktop/src/renderer/stores/settings/settingsStore.ts
#	apps/web/app/(marketing)/auth/verify/AuthVerifyContent.tsx
#	apps/web/app/(marketing)/changelog/page.tsx
#	apps/web/app/(marketing)/download/page.tsx
#	apps/web/app/(marketing)/pricing/page.tsx
#	apps/web/app/docs/[[...slug]]/page.tsx
#	apps/web/components/Footer.tsx
#	apps/web/components/Navbar.tsx
#	apps/web/components/landing/Hero.tsx
#	apps/web/components/landing/VideoGuides.tsx
#	apps/web/components/magicui/animated-shiny-text.tsx
#	apps/web/components/magicui/border-beam.tsx
#	apps/web/components/magicui/hero-video-dialog.tsx
#	package.json
#	packages/ai-core/src/ai-service.ts
#	packages/ai-core/src/context-builder.ts
#	packages/ai-core/src/index.ts
#	packages/ai-core/src/providers/anthropic.ts
#	packages/ai-core/src/providers/sse-parser.ts
#	packages/ai-core/src/retry.ts
#	packages/ai-core/src/types.ts
#	packages/ai-core/tests/ai-service.test.ts
#	packages/ai-core/tests/retry.test.ts
#	packages/ai-core/tests/types.test.ts
#	pnpm-lock.yaml
#	vercel.json
if (msg.includes('429') || msg.includes('rate limit') || msg.includes('rate_limit'))
return 'rate_limit';
if (msg.includes('401') || msg.includes('unauthorized') || msg.includes('invalid.*key'))
if (msg.includes('401') || msg.includes('unauthorized') || /invalid.*key/.test(msg))

Check failure

Code scanning / CodeQL

Polynomial regular expression used on uncontrolled data High

This
regular expression
that depends on
library input
may run slow on strings starting with 'invalid' and with many repetitions of 'invalid'.
@github-actions
github-actions Bot merged commit bbb12e1 into main Mar 19, 2026
24 of 25 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants